# user/middleware.py
from django.utils.deprecation import MiddlewareMixin
from django.http import JsonResponse
from rest_framework_jwt.settings import api_settings
from jwt import ExpiredSignatureError, PyJWTError, InvalidTokenError


class JwtAuthenticationMiddleware(MiddlewareMixin):

    def process_request(self, request):
        # 1️⃣ 先写白名单：这些路径不需要登录
        white_list = ["/admin/", "/user/login", "/user/captcha"]
        skip_prefixes = ("/admin/", "/media/", "/static/")

        path = request.path

        # 2️⃣ 如果访问的路径在白名单里，或者是静态资源(media/static)，直接放行
        if path in white_list or path.startswith(skip_prefixes):
            return None  # 放行     

        # 3️⃣ 只对 /api/ 开头的请求做验证
        if not path.startswith("/api/"):
            return None

        # 4️⃣ 从请求头里取出 token
        token = request.META.get("HTTP_AUTHORIZATION")
        print("请求头里的 token:", token)

        # 如果没带 token，直接返回错误
        if not token:
            return JsonResponse({"code": 401, "message": "请先登录（缺少token）"}, status=401)

        # 5️⃣ 校验 token
        try:
            jwt_decode_handler = api_settings.JWT_DECODE_HANDLER
            jwt_decode_handler(token)  # 解码验证
        except ExpiredSignatureError:
            return JsonResponse({"code": 401, "message": "token已过期，请重新登录"}, status=401)
        except InvalidTokenError:
            return JsonResponse({"code": 401, "message": "无效的token，请重新登录"}, status=401)
        except PyJWTError:
            return JsonResponse({"code": 401, "message": "token验证失败，请重新登录"}, status=401)

        # 6️⃣ 验证通过，继续往下走
        return None
